/**
 * 这里定义了全局的axios实例
 */
import axios from "axios";
import { joinURL } from "../components/common/utilities.js";
import { HOST_NAME_PORT } from "../lib/constants.js";
import { saveToStorage, getFromStorage } from "../localCache/lilyLocalCache.js";
// 创建一个 Axios 实例
const apiClient = axios.create({
  // baseURL: "http://localhost:3010",
  timeout: 50000,
});
/**
 * 请求刷新token
 * @returns {string} error message if any
 */
async function refreshToken() {
  const url = joinURL(HOST_NAME_PORT, "user/refresh");
  try {
    const response = await axios.get(url, {
      params: {
        refreshToken: getFromStorage("refresh_token"),
      },
    });
    const { accessToken, refreshToken } = response.data;
    console.log(response);
    if (response && accessToken && refreshToken) {
      saveToStorage("access_token", accessToken);
      saveToStorage("refresh_token", refreshToken);
      return { success: true, data: response }; // 返回成功结果
    } else {
      throw new Error("Invalid response format");
    }
  } catch (error) {
    console.error("Token refresh failed:", error);
    throw error; // 重新抛出错误，以便调用者可以处理
  }
}
// 添加请求拦截器,在每个请求之前都附上token的header
apiClient.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    const accessToken = getFromStorage("access_token");
    if (accessToken) {
      config.headers.authorization = "Bearer " + accessToken;
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);
//TODO如果token失效要弹出错误框提示用户
//添加响应拦截器，在如果遇到了accessToken失效的情况下要进行重新请求获取新的token
apiClient.interceptors.response.use(
  (response) => {
    // 请求成功，直接返回响应
    return response;
  },
  async (error) => {
    // 检查响应状态码是否为 401，并且请求的 URL 不包含 'refresh'
    const originalRequest = error.config;
    if (
      error.response &&
      error.response.status === 401 &&
      !originalRequest.url.includes("refresh")
    ) {
      // 尝试刷新访问令牌
      try {
        const refreshTokenResponse = await refreshToken();
        console.log(refreshTokenResponse);
        if (refreshTokenResponse && refreshTokenResponse.data.accessToken) {
          // 更新 apiClient 的默认头部以包含新的访问令牌
          apiClient.defaults.headers.Authorization = `Bearer ${refreshTokenResponse.data.accessToken}`;
          // 重试原始请求
          return apiClient(originalRequest);
        }
      } catch (refreshError) {
        // 刷新令牌失败，可能是刷新令牌本身也失效了或其他错误
        console.error("Refresh token failed:", refreshError);

        //TODO 这里可以执行其他错误处理逻辑，例如清除本地存储的令牌，跳转到登录页面等
        // handleAuthenticationError();
      }
    }

    // 如果不是 401 状态码，或刷新令牌失败，抛出错误
    return Promise.reject(error);
  }
);

export default apiClient;
